/*#ifndef GROUPING_H
#define GROUPING_H

#if !defined(_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 200809L
#define _POSIX_C_SOURCE 200809L
#endif

#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <math.h>

// HeavyGuardian 配置结构
typedef struct {
    uint32_t width;        // 哈希表宽度
    uint32_t depth;        // 哈希表深度
    uint32_t heavy_size;   // 高频项计数器数量
    uint32_t sparse_size;  // 稀疏项计数器数量
    double decay_base;     // 指数衰减基数
} HGConfig;

// HeavyGuardian 计数器项
typedef struct {
    char* item;           // 词项
    uint32_t count;       // 计数
} HGCounter;

// HeavyGuardian 桶
typedef struct {
    HGCounter* heavy;     // 高频项计数器数组
    HGCounter* sparse;    // 稀疏项计数器数组
} HGBucket;

// HeavyGuardian 主结构
typedef struct {
    HGConfig config;      // 配置
    HGBucket** buckets;   // 桶数组
    uint32_t total_count; // 总计数（用于误差估计）
} HeavyGuardian;

// 分组管理器
typedef struct {
    HeavyGuardian* hg;                // HeavyGuardian实例
    // 其他分组相关字段...
} GroupManager;

// 初始化HeavyGuardian
HeavyGuardian* hg_init(HGConfig config);

// 插入词项到HeavyGuardian
void hg_insert(HeavyGuardian* hg, const char* item);

// 查询词项频率
uint32_t hg_query(const HeavyGuardian* hg, const char* item);

// 释放HeavyGuardian资源
void hg_free(HeavyGuardian* hg);

// 初始化分组管理器
GroupManager* group_manager_init();

// 处理日志分词结果，返回分组关键词
const char* group_manager_process(GroupManager* gm, const char** tokens, uint32_t token_count);

// 释放分组管理器资源
void group_manager_free(GroupManager* gm);

// 获取HeavyGuardian中所有词项及其频率（用于调试）
void hg_get_all_items(const HeavyGuardian* hg, void (*callback)(const char* item, uint32_t count));
#endif // GROUPING_H
*/
#ifndef GROUPING_H
#define GROUPING_H

#if !defined(_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 200809L
#define _POSIX_C_SOURCE 200809L
#endif

#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <math.h>

// HeavyGuardian 配置结构
typedef struct {
    uint32_t width;        // 哈希表宽度
    uint32_t depth;        // 哈希表深度
    uint32_t heavy_size;   // 高频项计数器数量
    uint32_t sparse_size;  // 稀疏项计数器数量
    double decay_base;     // 指数衰减基数
} HGConfig;

// HeavyGuardian 计数器项
typedef struct {
    char* item;           // 词项
    uint32_t count;       // 计数
} HGCounter;

// HeavyGuardian 桶
typedef struct {
    HGCounter* heavy;     // 高频项计数器数组
    HGCounter* sparse;    // 稀疏项计数器数组
} HGBucket;

// HeavyGuardian 主结构
typedef struct {
    HGConfig config;      // 配置
    HGBucket** buckets;   // 桶数组
    uint32_t total_count; // 总计数（用于误差估计）
} HeavyGuardian;

// 日志模板结构
typedef struct {
    char* template_str;   // 模板字符串
    uint32_t ref_count;   // 引用计数
} LogTemplate;

// 模板组结构
typedef struct {
    char* group_key;           // 分组关键词
    LogTemplate** templates;   // 模板列表
    uint32_t template_count;   // 模板数量
    uint32_t template_capacity;// 模板数组容量
} TemplateGroup;

// 分组表结构
typedef struct {
    TemplateGroup** groups;    // 分组数组
    uint32_t group_count;      // 分组数量
    uint32_t group_capacity;   // 分组数组容量
} GroupTable;

// 分组管理器
typedef struct {
    HeavyGuardian* hg;         // HeavyGuardian实例
    GroupTable* group_table;   // 分组表
} GroupManager;

// 初始化HeavyGuardian
HeavyGuardian* hg_init(HGConfig config);

// 插入词项到HeavyGuardian
void hg_insert(HeavyGuardian* hg, const char* item);

// 查询词项频率
uint32_t hg_query(const HeavyGuardian* hg, const char* item);

// 释放HeavyGuardian资源
void hg_free(HeavyGuardian* hg);

// 初始化分组管理器
GroupManager* group_manager_init();

// 处理日志分词结果，返回分组ID
int group_manager_process(GroupManager* gm, const char** tokens, uint32_t token_count);

// 根据分组ID获取分组
TemplateGroup* group_manager_get_group(GroupManager* gm, int group_id);

// 向分组添加模板
bool group_manager_add_template(GroupManager* gm, int group_id, const char* template_str);

// 释放分组管理器资源
void group_manager_free(GroupManager* gm);

// 获取HeavyGuardian中所有词项及其频率（用于调试）
void hg_get_all_items(const HeavyGuardian* hg, void (*callback)(const char* item, uint32_t count));

// 获取分组表信息（用于调试）
void group_manager_print_groups(const GroupManager* gm);

#endif // GROUPING_H